{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "75cc235370d444ab",
   "metadata": {},
   "source": [
    "Copyright (c) MONAI Consortium  \n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");  \n",
    "you may not use this file except in compliance with the License.  \n",
    "You may obtain a copy of the License at  \n",
    "&nbsp;&nbsp;&nbsp;&nbsp;http://www.apache.org/licenses/LICENSE-2.0  \n",
    "Unless required by applicable law or agreed to in writing, software  \n",
    "distributed under the License is distributed on an \"AS IS\" BASIS,  \n",
    "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  \n",
    "See the License for the specific language governing permissions and  \n",
    "limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63d95da6",
   "metadata": {},
   "source": [
    "# Weakly Supervised Anomaly Detection with Implicit Guidance\n",
    "\n",
    "This tutorial illustrates how to use MONAI Generative Models for training a 2D anomaly detection using DDIMs [1]. By leveraging recent advances in generative diffusion probabilistic models, we synthesize counterfactuals of \"How would a patient appear if X pathology was not present?\". The difference image between the observed patient state and the healthy counterfactual can be used for inferring the location of pathology. We generate counterfactuals that correspond to the minimal change of the input such that it is transformed to healthy domain. We create these counterfactual diffusion models by manipulating the generation process with implicit guidance.\n",
    "\n",
    "In summary, the tutorial will cover the following:\n",
    "1. Loading and preprocessing a dataset (we extract the brain MRI dataset 2D slices from 3D volumes from the BraTS dataset)\n",
    "2. Training a 2D diffusion model\n",
    "3. Anomaly detection with the trained model\n",
    "\n",
    "This method results in anomaly heatmaps. It is weakly supervised. The information about labels is not fed to the model as segmentation masks but as a scalar signal (is there an anomaly or not), which is used to guide the diffusion process.\n",
    "\n",
    "During inference, the model generates a counterfactual image, which is then compared to the original image. The difference between the two images is used to generate an anomaly heatmap.\n",
    "\n",
    "[1] - Sanchez et al. [What is Healthy? Generative Counterfactual Diffusion for Lesion Localization](https://arxiv.org/abs/2207.12268). DGM 4 MICCAI 2022"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e054c148b8aceca",
   "metadata": {},
   "source": [
    "## Setup environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "130611664cf10de6",
   "metadata": {},
   "outputs": [],
   "source": [
    "!python -c \"import monai\" || pip install -q \"monai-weekly[tqdm]\"\n",
    "!python -c \"import matplotlib\" || pip install -q matplotlib\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b766027",
   "metadata": {},
   "source": [
    "## Setup imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "972ed3f3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:21:24.163260Z",
     "start_time": "2024-09-06T14:21:21.766205Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MONAI version: 1.4.dev2434\n",
      "Numpy version: 1.26.4\n",
      "Pytorch version: 2.4.0+cu121\n",
      "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n",
      "MONAI rev id: dc611d231ba670004b1da1b011fe140375fb91af\n",
      "MONAI __file__: /home/<username>/monaigen-tutorials-v2/venv/lib/python3.11/site-packages/monai/__init__.py\n",
      "\n",
      "Optional dependencies:\n",
      "Pytorch Ignite version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "ITK version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "Nibabel version: 5.2.1\n",
      "scikit-image version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "scipy version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "Pillow version: 10.4.0\n",
      "Tensorboard version: 2.17.1\n",
      "gdown version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "TorchVision version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "tqdm version: 4.66.5\n",
      "lmdb version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "psutil version: 6.0.0\n",
      "pandas version: 2.2.2\n",
      "einops version: 0.8.0\n",
      "transformers version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "mlflow version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "pynrrd version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "clearml version: NOT INSTALLED or UNKNOWN VERSION.\n",
      "\n",
      "For details about installing the optional dependencies, please visit:\n",
      "    https://docs.monai.io/en/latest/installation.html#installing-the-recommended-dependencies\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import tempfile\n",
    "import time\n",
    "import os\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import sys\n",
    "from monai import transforms\n",
    "from monai.apps import DecathlonDataset\n",
    "from monai.config import print_config\n",
    "from monai.data import DataLoader\n",
    "from monai.utils import set_determinism\n",
    "from torch.amp import GradScaler, autocast\n",
    "from tqdm import tqdm\n",
    "\n",
    "from monai.inferers import DiffusionInferer\n",
    "from monai.networks.nets.diffusion_model_unet import DiffusionModelUNet\n",
    "from monai.networks.schedulers.ddim import DDIMScheduler\n",
    "\n",
    "torch.multiprocessing.set_sharing_strategy(\"file_system\")\n",
    "\n",
    "print_config()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d4ff515",
   "metadata": {},
   "source": [
    "## Setup data directory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8b4323e7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:21:26.144047Z",
     "start_time": "2024-09-06T14:21:26.140245Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "directory = os.environ.get(\"MONAI_DATA_DIRECTORY\")\n",
    "root_dir = tempfile.mkdtemp() if directory is None else directory"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99175d50",
   "metadata": {},
   "source": [
    "## Set deterministic training for reproducibility"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "34ea510f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:21:29.054463Z",
     "start_time": "2024-09-06T14:21:29.048133Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "set_determinism(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3f70dd1-236a-47ff-a244-575729ad92ba",
   "metadata": {},
   "source": [
    "## Setup BRATS Dataset  - Transforms for extracting 2D slices from 3D volumes\n",
    "\n",
    "We now download the BraTS dataset and extract the 2D slices from the 3D volumes. The `slice_label` is used to indicate whether the slice contains an anomaly or not."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6986f55c",
   "metadata": {},
   "source": [
    "Here we use transforms to augment the training dataset, as usual:\n",
    "\n",
    "1. `LoadImaged` loads the brain images from files.\n",
    "2. `EnsureChannelFirstd` ensures the original data to construct \"channel first\" shape.\n",
    "3.  The first `Lambdad` transform chooses the first channel of the image, which is the T1-weighted image.\n",
    "4. `Spacingd` resamples the image to the specified voxel spacing, we use 3,3,2 mm to match the original paper.\n",
    "5. `ScaleIntensityRangePercentilesd` Apply range scaling to a numpy array based on the intensity distribution of the input. Transform is very common with MRI images.\n",
    "6. `RandSpatialCropd` randomly crop out a 2D patch from the 3D image.\n",
    "7. The last `Lambdad` transform obtains `slice_label` by summing up the label to have a single scalar value (healthy `=1` or not `=2` )."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c68d2d91-9a0b-4ac1-ae49-f4a64edbd82a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:21:31.828905Z",
     "start_time": "2024-09-06T14:21:31.815692Z"
    }
   },
   "outputs": [],
   "source": [
    "channel = 0  # 0 = Flair\n",
    "assert channel in [0, 1, 2, 3], \"Choose a valid channel\"\n",
    "\n",
    "train_transforms = transforms.Compose(\n",
    "    [\n",
    "        transforms.LoadImaged(keys=[\"image\", \"label\"]),\n",
    "        transforms.EnsureChannelFirstd(keys=[\"image\", \"label\"]),\n",
    "        transforms.Lambdad(keys=[\"image\"], func=lambda x: x[channel, :, :, :]),\n",
    "        transforms.EnsureChannelFirstd(channel_dim=\"no_channel\", keys=[\"image\"]),\n",
    "        transforms.EnsureTyped(keys=[\"image\", \"label\"]),\n",
    "        transforms.Orientationd(keys=[\"image\", \"label\"], axcodes=\"RAS\"),\n",
    "        transforms.Spacingd(keys=[\"image\", \"label\"], pixdim=(3.0, 3.0, 2.0), mode=(\"bilinear\", \"nearest\")),\n",
    "        transforms.CenterSpatialCropd(keys=[\"image\", \"label\"], roi_size=(64, 64, 44)),\n",
    "        transforms.ScaleIntensityRangePercentilesd(keys=\"image\", lower=0, upper=99.5, b_min=0, b_max=1),\n",
    "        transforms.RandSpatialCropd(keys=[\"image\", \"label\"], roi_size=(64, 64, 1), random_size=False),\n",
    "        transforms.Lambdad(keys=[\"image\", \"label\"], func=lambda x: x.squeeze(-1)),\n",
    "        transforms.CopyItemsd(keys=[\"label\"], times=1, names=[\"slice_label\"]),\n",
    "        transforms.Lambdad(keys=[\"slice_label\"], func=lambda x: 2.0 if x.sum() > 0 else 1.0),\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d378ac6",
   "metadata": {},
   "source": [
    "### Load Training and Validation Datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "da1927b0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:26:08.362446Z",
     "start_time": "2024-09-06T14:21:33.580563Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2024-09-06 15:21:46,961 - INFO - Verified 'Task01_BrainTumour.tar', md5: 240a19d752f0d9e9101544901065d872.\n",
      "2024-09-06 15:21:46,962 - INFO - File exists: /tmp/tmp1c90eu7x/Task01_BrainTumour.tar, skipped downloading.\n",
      "2024-09-06 15:21:46,963 - INFO - Non-empty folder exists in /tmp/tmp1c90eu7x/Task01_BrainTumour, skipped extracting.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading dataset: 100%|██████████| 388/388 [03:21<00:00,  1.92it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Length of training data: 388\n",
      "Train image shape torch.Size([1, 64, 64])\n",
      "2024-09-06 15:25:19,477 - INFO - Verified 'Task01_BrainTumour.tar', md5: 240a19d752f0d9e9101544901065d872.\n",
      "2024-09-06 15:25:19,478 - INFO - File exists: /tmp/tmp1c90eu7x/Task01_BrainTumour.tar, skipped downloading.\n",
      "2024-09-06 15:25:19,479 - INFO - Non-empty folder exists in /tmp/tmp1c90eu7x/Task01_BrainTumour, skipped extracting.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading dataset: 100%|██████████| 96/96 [00:48<00:00,  1.96it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Length of training data: 96\n",
      "Validation Image shape torch.Size([1, 64, 64])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "train_ds = DecathlonDataset(\n",
    "    root_dir=root_dir,\n",
    "    task=\"Task01_BrainTumour\",\n",
    "    section=\"training\",\n",
    "    cache_rate=1.0,  # you may need a few Gb of RAM... Set to 0 otherwise\n",
    "    num_workers=4,\n",
    "    download=True,  # Set download to True if the dataset hasn't been downloaded yet\n",
    "    seed=0,\n",
    "    transform=train_transforms,\n",
    ")\n",
    "print(f\"Length of training data: {len(train_ds)}\")\n",
    "print(f'Train image shape {train_ds[0][\"image\"].shape}')\n",
    "\n",
    "val_ds = DecathlonDataset(\n",
    "    root_dir=root_dir,\n",
    "    task=\"Task01_BrainTumour\",\n",
    "    section=\"validation\",\n",
    "    cache_rate=1.0,  # you may need a few Gb of RAM... Set to 0 otherwise\n",
    "    num_workers=4,\n",
    "    download=True,  # Set download to True if the dataset hasn't been downloaded yet\n",
    "    seed=0,\n",
    "    transform=train_transforms,\n",
    ")\n",
    "print(f\"Length of training data: {len(val_ds)}\")\n",
    "print(f'Validation Image shape {val_ds[0][\"image\"].shape}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08428bc6",
   "metadata": {},
   "source": [
    "## Define network, scheduler, optimizer, and inferer\n",
    "\n",
    "At this step, we instantiate the MONAI components to create a DDIM, the UNET with conditioning, the noise scheduler, and the inferer used for training and sampling. We are using\n",
    "the deterministic DDIM scheduler containing 1000 timesteps, and a 2D UNET with attention mechanisms.\n",
    "\n",
    "The `attention` mechanism is essential for ensuring good conditioning and images manipulation here.\n",
    "\n",
    "An `embedding layer`, which is also optimised during training, is used in the original work because it was empirically shown to improve conditioning compared to a single scalar information.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "bee5913e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T14:26:23.928114Z",
     "start_time": "2024-09-06T14:26:23.547423Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "lines_to_next_cell": 2
   },
   "outputs": [],
   "source": [
    "device = torch.device(\"cuda\")\n",
    "embedding_dimension = 64\n",
    "model = DiffusionModelUNet(\n",
    "    spatial_dims=2,\n",
    "    in_channels=1,\n",
    "    out_channels=1,\n",
    "    channels=(64, 64, 64),\n",
    "    attention_levels=(False, True, True),\n",
    "    num_res_blocks=1,\n",
    "    num_head_channels=16,\n",
    "    with_conditioning=True,\n",
    "    cross_attention_dim=embedding_dimension,\n",
    ").to(device)\n",
    "embed = torch.nn.Embedding(num_embeddings=3, embedding_dim=embedding_dimension, padding_idx=0).to(device)\n",
    "\n",
    "scheduler = DDIMScheduler(num_train_timesteps=1000)\n",
    "optimizer = torch.optim.Adam(params=list(model.parameters()) + list(embed.parameters()), lr=1e-5)\n",
    "\n",
    "inferer = DiffusionInferer(scheduler)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f815ff34",
   "metadata": {},
   "source": [
    "## Training a diffusion model with classifier-free guidance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9a4fc901",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T15:37:46.751077Z",
     "start_time": "2024-09-06T14:26:25.926214Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Loss 0.8151, Interval Loss 0.9143, Interval Loss Val 0.8126\n",
      "Train Loss 0.6221, Interval Loss 0.7115, Interval Loss Val 0.6187\n",
      "...\n",
      "Train Loss 0.0140, Interval Loss 0.0161, Interval Loss Val 0.0210\n",
      "Train Loss 0.0168, Interval Loss 0.0167, Interval Loss Val 0.0176\n",
      "train diffusion completed, total time: 4280.638695478439.\n"
     ]
    },
    {
     "data": {
      "image/png": "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hIQE+TPh6+srRowYITZs2CCOHDki9u3bJ5YuXSree+89kS9fvpcKirp27Spvu0KFCmLRokXi0KFDYtOmTaJfv37y+REYGChu3rzpsLxtUFSrVi2hUChEnz59xPr168WRI0fEqlWr5M8tkPyPvZQkDooOHTok///cuXN2ZU0mk8iXL58AIL788kshRMpB0bp16+T99fHxEePGjRO7d+8W+/btE1999ZXInTu3vL0ffvjB6TpmzJhhF0x+++234sCBA2Lnzp1ixIgRQq1Wi4IFC4rg4OBkj8v//vc/eT316tUT8+bNEzt27BAHDx4Us2fPFmXKlJHnr1692mF5BkWUaukJimbNmiUACA8PD7FhwwanZR49eiSfsLVr13aYf//+fREdHZ3kNnQ6nWjSpIn84TUajQ5lbC8WCoVCbNq0Kcn12Zb18PBw+gF5+PCh3DpTvnx5p+tJbVAEQLz11lvCbDY7lHvzzTflMkePHnWY//7778vzv/76a4f5RqNRtGvXzm5bLxMUFS1aVH7vEhIS0rx8YhkdFAEQjRo1SrJuKQU7VrbB09KlS+3m3b9/X/j7+wsA4o033nDaEiSEkFusFAqFOH/+vN288PBwASDFoOfhw4fJzk/KywZFY8aMkZdbtGiR3byULhaJWz2TkprWyowIirZu3SrPcxb0WBkMBhETE+MwPbmgaN26dXbnm06ncyhj/c4DILp27eow3/Z9ACAWL17sUCYhIUGULVtWABBBQUFJnmspSRwUCSHkH3SjR4+2K7tlyxYBWFp2oqKihBDJB0V6vV4OPn18fJy2jF27dk2EhoYKwNIKmbjl9e7du8LLy0vehnW7trZu3SpUKpW8H86Oy+bNm+X5c+bMcfpexMfHi1dffVXeVuL3NLsERcwpysaEEPj8888BAIMHD0bz5s2dlsuVKxemTZsGANizZw/+/fdfu/m5c+dOdsRbtVotL3/9+nWHEXQT69u3L5o2bZqqfRg0aJDTvJfAwEA5R+LUqVNyV+OXERoaim+//dZp3szw4cPl14l7geh0OjkfqWrVqhgyZIjD8kqlEj///HOK45Kk5OHDhwAAf39/aDSadK0rMygUCsyZMyfJuqlUKrnHjXXgQGeWLFkCAPDx8UG7du3s5v3444+IiYlBvnz58MMPP0Clct45dsKECciXLx/MZjMWLVpkN886mGXdunWT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6PV6u3nWPKTg4OCMr/DL8njR4qVhThEREZFLuWVQ1LlzZ5hMJsyaNUueptPpMH/+fFSvXl3O9YmMjMT58+ftlu3WrRtMJhMWLlwoT0tISMCSJUtQunTpJFuZXMKmpUgrMaeIiIjIldzy9ln16tXRpUsXjBo1Cvfu3UPRokWxcOFCXLt2DXPnzpXL9e7dGzt37rR7kOrbb7+NOXPm4N1338XFixdRoEABLF68GNevX8fatWtdsTtJs80pgh46thQRERG5jFsGRQCwaNEijB07FosXL0Z0dDTKly+PdevWoV69esku5+npiW3btmHEiBGYN28enj17hooVK2L9+vVo1qxZFtU+lThOERERkdtw26BIq9Vi2rRpmDZtWpJlduzY4XR6SEgIFixYkDkVy0iJEq15+4yIiMh13DKn6D/DJtGaXfKJiIhci0GRK3kkHtGaLUVERESuwqDIlVTskk9EROQuGBS5kk2itSe75BMREbkUgyJX4gNhiYiI3AaDIldKnFPEliIiIiKXYVDkSg6J1mwpIiIichUGRa7Ex3wQERG5DQZFrpSopYiP+SAiInIdBkWuxNtnREREboNBkSupEo9ozdtnRERErsKgyJWUKkBhefycFnrojGwpIiIichUGRa72vLXIk4/5ICIicikGRa72PK9IK+mRYDRBCOHiChEREf03MShyteeP+tBADyEAvYmtRURERK7AoMjVnt8+08IAAByriIiIyEUYFLna85YiT+gAgN3yiYiIXIRBkas9bylSSWaoYESCni1FRERErsCgyNUSDeAYZzC6sDJERET/XQyKXM0uKDIgTs/bZ0RERK7AoMjVEj0UNp5BERERkUswKHI1u5YiHVuKiIiIXIRBkaslzinSM6eIiIjIFRgUuZrt7TPo2SWfiIjIRRgUuZptS5HERGsiIiJXSVdQZDKZEBsbC6PR/pZPfHw8JkyYgA4dOmDo0KG4fft2uiqZo9m0FHkyp4iIiMhlVOlZ+NNPP8XEiROxY8cO1K1bFwAghECDBg1w+PBhCCEgSRJWrlyJ48ePI1euXBlS6RzFw0t+qQV7nxEREblKulqKtm7dirx588oBEQCsXbsWhw4dQrFixfD111+jadOmuHnzJmbPnp3uyuZIHvZd8tlSRERE5BrpCoquXr2KkiVL2k1bvXo1JEnCkiVLMHjwYKxduxbBwcFY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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "condition_dropout = 0.15\n",
    "max_epochs = 20000\n",
    "batch_size = 64\n",
    "val_interval = 100\n",
    "iter_loss_list = []\n",
    "val_iter_loss_list = []\n",
    "iterations = []\n",
    "iteration = 0\n",
    "iter_loss = 0\n",
    "\n",
    "train_loader = DataLoader(\n",
    "    train_ds, batch_size=batch_size, shuffle=True, num_workers=4, drop_last=True, persistent_workers=True\n",
    ")\n",
    "val_loader = DataLoader(\n",
    "    val_ds, batch_size=batch_size, shuffle=False, num_workers=4, drop_last=True, persistent_workers=True\n",
    ")\n",
    "\n",
    "scaler = GradScaler(\"cuda\")\n",
    "total_start = time.time()\n",
    "\n",
    "while iteration < max_epochs:\n",
    "    for batch in train_loader:\n",
    "        iteration += 1\n",
    "        model.train()\n",
    "        images, classes = batch[\"image\"].to(device), batch[\"slice_label\"].to(device)\n",
    "        # 15% of the time, class conditioning dropout\n",
    "        classes = classes * (torch.rand_like(classes) > condition_dropout)\n",
    "        # cross attention expects shape [batch size, sequence length, channels]\n",
    "        class_embedding = embed(classes.long().to(device)).unsqueeze(1)\n",
    "        optimizer.zero_grad(set_to_none=True)\n",
    "        # pick a random time step t\n",
    "        timesteps = torch.randint(0, 1000, (len(images),)).to(device)\n",
    "\n",
    "        with autocast(enabled=True, device_type=\"cuda\"):\n",
    "            # Generate random noise\n",
    "            noise = torch.randn_like(images).to(device)\n",
    "            # Get model prediction\n",
    "            noise_pred = inferer(\n",
    "                inputs=images, diffusion_model=model, noise=noise, timesteps=timesteps, condition=class_embedding\n",
    "            )\n",
    "            loss = F.mse_loss(noise_pred.float(), noise.float())\n",
    "\n",
    "        scaler.scale(loss).backward()\n",
    "        scaler.step(optimizer)\n",
    "        scaler.update()\n",
    "        iter_loss += loss.item()\n",
    "        sys.stdout.write(f\"Iteration {iteration}/{max_epochs} - train Loss {loss.item():.4f}\" + \"\\r\")\n",
    "        sys.stdout.flush()\n",
    "\n",
    "        if iteration % val_interval == 0:\n",
    "            model.eval()\n",
    "            len_val_loader = len(val_loader)\n",
    "            val_iter_loss = 0\n",
    "            for val_batch in val_loader:\n",
    "                images, classes = val_batch[\"image\"].to(device), val_batch[\"slice_label\"].to(device)\n",
    "                # cross attention expects shape [batch size, sequence length, channels]\n",
    "                class_embedding = embed(classes.long().to(device)).unsqueeze(1)\n",
    "                timesteps = torch.randint(0, 1000, (len(images),)).to(device)\n",
    "                with torch.no_grad():\n",
    "                    with autocast(enabled=True, device_type=\"cuda\"):\n",
    "                        noise = torch.randn_like(images).to(device)\n",
    "                        noise_pred = inferer(\n",
    "                            inputs=images,\n",
    "                            diffusion_model=model,\n",
    "                            noise=noise,\n",
    "                            timesteps=timesteps,\n",
    "                            condition=class_embedding,\n",
    "                        )\n",
    "                        val_loss = F.mse_loss(noise_pred.float(), noise.float())\n",
    "                val_iter_loss += val_loss.item()\n",
    "            iter_loss_list.append(iter_loss / val_interval)\n",
    "            val_iter_loss_list.append(val_iter_loss / len_val_loader)\n",
    "            iterations.append(iteration)\n",
    "            iter_loss = 0\n",
    "            print(\n",
    "                f\"Train Loss {loss.item():.4f}, Interval Loss \"\n",
    "                f\"{iter_loss_list[-1]:.4f}, Interval Loss Val \"\n",
    "                f\"{val_iter_loss_list[-1]:.4f}\"\n",
    "            )\n",
    "\n",
    "\n",
    "total_time = time.time() - total_start\n",
    "\n",
    "print(f\"train diffusion completed, total time: {total_time}.\")\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.title(\"Learning Curves Diffusion Model\", fontsize=20)\n",
    "plt.plot(iterations, iter_loss_list, color=\"C0\", linewidth=2.0, label=\"Train\")\n",
    "plt.plot(iterations, val_iter_loss_list, color=\"C1\", linewidth=2.0, label=\"Validation\")\n",
    "plt.yticks(fontsize=12)\n",
    "plt.xticks(fontsize=12)\n",
    "plt.xlabel(\"Iterations\", fontsize=16)\n",
    "plt.ylabel(\"Loss\", fontsize=16)\n",
    "plt.legend(prop={\"size\": 14})\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd2b79a4",
   "metadata": {},
   "source": [
    "## Generate synthetic data\n",
    "(Only for verifying the model and classifier guidance is working)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "98e17f78",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T15:37:49.015174Z",
     "start_time": "2024-09-06T15:37:46.753620Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [00:02<00:00, 46.00it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbsAAAG7CAYAAABaaTseAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsQUlEQVR4nO3dSYxdV7XG8RVC2XFf7sq94ziNnT7EJJBBSAiIhAFEkWjECJghgQTDDBkwR0ggGCEmNOMIEEpHlyAklE4hxnFIHDdlV5VdLjflpuxA3uQR8fL29/ne5eOb6+X/b7i3973nnnPuWS7p2+te9e67774bAAAU9qEP+gAAALjUKHYAgPIodgCA8ih2AIDyKHYAgPIodgCA8ih2AIDyKHYAgPI+3Os/vOqqqzp946uvvro5/u9//1uuGYb97x/+sD5l77zzTnP8Qx/S/6dwn3fevHnN8fPnz8s1XZ+jBQsWNMfn5ubkGveZ1HX/17/+1d+B/a9rrrmmOX7u3Dm5Rh2fu8fdNVTH7ta465Q5R+r11GtF5L5rIyMjfa+J0Mfuzrk7vi5lvtNdc+fVfd8rUt+bi60N/GUHACiPYgcAKI9iBwAoj2IHACiPYgcAKI9iBwAo76pef89u/vz5ck7FijNx8mxcOxO5z7yXex/1epmYuVvnzquLcne5LeGOO+6Qczt37uz7GNxxdx3/zkSbM9dpUNH5YZGJ8GfWZLeIqHXu/ur6+6Seo26rTOZ93P3a9XNZ3edLliyRa9x5PXHiRO8H9r/YegAAQFDsAABXAIodAKA8ih0AoDyKHQCgvJ7TmF03gs4YVNIwSx3fMByb486rSnUNqkFuxOAa9XadYBsG7tqqRuMRvtH3oGRSs8Mgk1x097i799R7Xa73a0TuOUoaEwCAoNgBAK4AFDsAQHkUOwBAeRQ7AEB5FDsAQHk9bz1wcVoV2Xbx12GP4yuZ7Q+ZKLIzDBH57HaAQcXJuz7nXb/eyMiInDt//nxz3N17Xce11eu5YxjUNRz2e8UZ1PakTEPsiG6fH4M8r2w9AAAgKHYAgCsAxQ4AUB7FDgBQHsUOAFBez2lM1zRWJXgySbBM4iwil+4Z9sbSV5LsdVe6vh9cskzd/5nEZYROurrPNAwJ08x7DfJ7q66HSyC641PPxHPnzsk1w8Bdd3X+huF5eLHPf/6yAwCUR7EDAJRHsQMAlEexAwCUR7EDAJRHsQMAlNfz1gPXfLjLmHLX2wGyr6fiudnGuoOSiel3fdzZJtGKi0qruUxD264bbGfur4juY/+D4j6Tcrl+1ohcA/yMYWg+P0jq+eGeHTSCBgAgKHYAgCsAxQ4AUB7FDgBQHsUOAFAexQ4AUF7PWw8yHeGHPeKaifRm4umZLuNuXdfRZrdVQB2fu7bDsAWja5lrmPmlhOwxqOvhfnnBHYP6bnR973Utc44G+Usrmfdx3091DO46db3FJiPz7OVXDwAAuACKHQCgPIodAKA8ih0AoDyKHQCgvE7SmGpukI2bXWJJ6bq577x585rj586d6/t9subPny/n1HG4c6eSW2fPnu3vwC6CS49lZK57prn1IJvxdvkddLIN4btMN2epa+jex52/TCNodQzuPMzNzcm5rl2uyXoaQQMAEBQ7AMAVgGIHACiPYgcAKI9iBwAoj2IHACivk60HqTceUFTaUVsFInLbBTJRZCezlWHBggVyTp1bt42g6+ukotcqvp+V2cLitgq4uUFtPchsf8g0cI8YjobPma0CLsKvzlHX2yky23+y26rUNTx//rxckzlHw46tBwAABMUOAHAFoNgBAMqj2AEAyqPYAQDKo9gBAMrreevBoOKvg4w8Z39hYVBcNFzJRNpHRkbknDoPwx5R7jr23/W94l5vyZIlzfEzZ87INe67lqHOnztu991V69zrDarT/iCfA5lfFXDHp56j7rgzz9jML4+454r7JYfMOWfrAQAAQbEDAFwBKHYAgPIodgCA8ih2AIDyLmkj6Ezj2stZJmk1SCod1XWSr2sbNmyQc+Pj483xrtOYTiYR544h0wB8GBqrO8N+fNW4+9+d866TxUrm+3mxx81fdgCA8ih2AIDyKHYAgPIodgCA8ih2AIDyKHYAgPIu6daDYeAamGYaog6qObMzyKbEjz/+eHN8enparnn22Wfl3P79+5vjrjGsOz51PRYuXCjXqOvu7gcX+1fcvdf11hu1zSfTnDliOLbLDMN3rWuZbSUZw97k3lH3sru2vTzL+csOAFAexQ4AUB7FDgBQHsUOAFAexQ4AUF7PaUyXLMs0wh32RtAqEeSOe1DNbm+66SY5d++998o59Zn27Nkj1xw/frw57s7D2bNn5dzMzEzfa6677jo59/e//7057pqQz58/vznuEmyzs7NyThkbG5Nz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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.eval()\n",
    "scheduler.clip_sample = True\n",
    "guidance_scale = 3\n",
    "conditioning = torch.cat([torch.zeros(1).long(), 2 * torch.ones(1).long()], dim=0).to(\n",
    "    device\n",
    ")  # 2*torch.ones(1).long() is the class label for the UNHEALTHY (tumor) class\n",
    "class_embedding = embed(conditioning).unsqueeze(\n",
    "    1\n",
    ")  # cross attention expects shape [batch size, sequence length, channels]\n",
    "noise = torch.randn((1, 1, 64, 64))\n",
    "noise = noise.to(device)\n",
    "scheduler.set_timesteps(num_inference_steps=100)\n",
    "progress_bar = tqdm(scheduler.timesteps)\n",
    "for t in progress_bar:\n",
    "    with autocast(enabled=True, device_type=\"cuda\"):\n",
    "        with torch.no_grad():\n",
    "            noise_input = torch.cat([noise] * 2)\n",
    "            model_output = model(noise_input, timesteps=torch.Tensor((t,)).to(noise.device), context=class_embedding)\n",
    "            noise_pred_uncond, noise_pred_text = model_output.chunk(2)\n",
    "            noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)\n",
    "\n",
    "    noise, _ = scheduler.step(noise_pred, t, noise)\n",
    "\n",
    "plt.style.use(\"default\")\n",
    "plt.imshow(noise[0, 0].cpu(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a676b3fe",
   "metadata": {},
   "source": [
    "# Image-to-Image Translation to a Healthy Subject\n",
    "We pick a diseased subject of the validation set as input image. We want to translate it to its healthy reconstruction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "fe0d9eac-1477-4d6d-a885-d3c4acb4a781",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T15:37:49.068262Z",
     "start_time": "2024-09-06T15:37:49.016299Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input label:  2.0\n"
     ]
    }
   ],
   "source": [
    "idx_unhealthy = np.argwhere(val_batch[\"slice_label\"].numpy() == 2).squeeze()\n",
    "\n",
    "idx = idx_unhealthy[4]  # Pick a random slice of the validation set to be transformed\n",
    "inputting = val_batch[\"image\"][idx]  # Pick an input slice of the validation set to be transformed\n",
    "inputlabel = val_batch[\"slice_label\"][idx]  # Check whether it is healthy or diseased\n",
    "\n",
    "plt.figure(\"input\" + str(inputlabel))\n",
    "plt.imshow(inputting[0], vmin=0, vmax=1, cmap=\"gray\")\n",
    "plt.axis(\"off\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "model.eval()\n",
    "print(\"input label: \", inputlabel.item())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7c8346a-6296-4800-b978-c10fcdf09779",
   "metadata": {},
   "source": [
    "\n",
    "### The image-to-image translation has two steps\n",
    "\n",
    "1. Encoding the input image into a latent space with the reversed DDIM sampling scheme\n",
    "2. Sampling from the latent space using gradient guidance towards the desired class label `y=1` (healthy)\n",
    "\n",
    "In order to sample using gradient guidance, we first need to encode the input image in noise by using the reversed DDIM sampling scheme.\n",
    "We define the number of steps in the noising and denoising process by `L`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ca28e70c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T15:37:57.520399Z",
     "start_time": "2024-09-06T15:37:49.069827Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 125/125 [00:04<00:00, 31.09it/s, timestep input=124]\n",
      "100%|██████████| 125/125 [00:04<00:00, 28.30it/s, timestep input=1] \n"
     ]
    }
   ],
   "source": [
    "model.eval()\n",
    "\n",
    "guidance_scale = 3.0\n",
    "total_timesteps = 500\n",
    "latent_space_depth = int(total_timesteps * 0.25)\n",
    "\n",
    "current_img = inputting[None, ...].to(device)\n",
    "scheduler.set_timesteps(num_inference_steps=total_timesteps)\n",
    "\n",
    "# Encoding\n",
    "\n",
    "scheduler.clip_sample = False\n",
    "class_embedding = embed(torch.zeros(1).long().to(device)).unsqueeze(1)\n",
    "progress_bar = tqdm(range(latent_space_depth))\n",
    "for i in progress_bar:  # go through the noising process\n",
    "    t = i\n",
    "    with torch.no_grad():\n",
    "        model_output = model(current_img, timesteps=torch.Tensor((t,)).to(current_img.device), context=class_embedding)\n",
    "    current_img, _ = scheduler.reversed_step(model_output, t, current_img)\n",
    "    progress_bar.set_postfix({\"timestep input\": t})\n",
    "\n",
    "latent_img = current_img\n",
    "\n",
    "# Decoding\n",
    "conditioning = torch.cat([torch.zeros(1).long(), torch.ones(1).long()], dim=0).to(device)\n",
    "class_embedding = embed(conditioning).unsqueeze(1)\n",
    "\n",
    "progress_bar = tqdm(range(latent_space_depth))\n",
    "for i in progress_bar:  # go through the denoising process\n",
    "    t = latent_space_depth - i\n",
    "    current_img_double = torch.cat([current_img] * 2)\n",
    "    with torch.no_grad():\n",
    "        model_output = model(\n",
    "            current_img_double, timesteps=torch.Tensor([t, t]).to(current_img.device), context=class_embedding\n",
    "        )\n",
    "    noise_pred_uncond, noise_pred_text = model_output.chunk(2)\n",
    "    noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)\n",
    "    current_img, _ = scheduler.step(noise_pred, t, current_img)\n",
    "    progress_bar.set_postfix({\"timestep input\": t})\n",
    "    torch.cuda.empty_cache()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "188fe33b",
   "metadata": {},
   "source": [
    "### Visualize anomaly map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "502ba4f5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-06T15:37:57.772217Z",
     "start_time": "2024-09-06T15:37:57.521555Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8IAAAEfCAYAAACK1H91AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACfj0lEQVR4nO2dd5QV1fL9697JM+ScGXJWFBEREIzIEwQUswKKijlj/CoYnorp8UyYRR8oCqJixIQoCgIGEBCJQ5KcmTxz+/eHP07vquE2M+MA4t2ftVireqrD6XRON7d275DneZ4QQgghhBBCCCExQvhgN4AQQgghhBBCCDmQ8EWYEEIIIYQQQkhMwRdhQgghhBBCCCExBV+ECSGEEEIIIYTEFHwRJoQQQgghhBASU/BFmBBCCCGEEEJITMEXYUIIIYQQQgghMQVfhAkhhBBCCCGExBR8ESaEEEIIIYQQElPwRZgQQgghhBSLjIwMCYVCMmbMmIPdFEII+UvwRZgQQggh+5UxY8ZIKBRy/+Lj46Vu3boyePBgWbt27cFuXpnz7LPPHvQXxb9DGwgh5O9M/MFuACGEEEJig/vuu08aNWokOTk5MnPmTBkzZoxMnz5d5s+fL8nJyQe7eWXGs88+K9WqVZPBgwfHdBsIIeTvDF+ECSGEEHJA6NWrlxx11FEiInLppZdKtWrVZOTIkTJ58mQ5++yzD3LrDg6ZmZmSlpZ2sJtBCCExB0ujCSGEEHJQ6Natm4iILFu2TP190aJFMmDAAKlSpYokJyfLUUcdJZMnTy6y/Pbt2+XGG2+U9PR0SUpKknr16snAgQNl8+bNbp6NGzfKkCFDpGbNmpKcnCyHH364vPbaa2o9e3Svjz32mLzwwgvSpEkTSUpKko4dO8rs2bPVvOvXr5eLL75Y6tWrJ0lJSVK7dm3p27evZGRkiIhIenq6LFiwQKZNm+ZKwXv06CEifon4tGnT5KqrrpIaNWpIvXr1RERk8ODBkp6eXmQfR4wYIaFQqMjfx44dK0cffbSkpqZK5cqV5bjjjpPPPvtsn23Yc9xuuOEGqV+/viQlJUnTpk1l5MiREolEihzfwYMHS8WKFaVSpUoyaNAg2b59e5G2EELIoQh/ESaEEELIQWHPy2PlypXd3xYsWCBdunSRunXryu233y5paWny9ttvS79+/eSdd96R/v37i4jI7t27pVu3bvLbb7/JJZdcIkceeaRs3rxZJk+eLGvWrJFq1apJdna29OjRQ5YuXSrXXHONNGrUSCZMmCCDBw+W7du3y/XXX6/a88Ybb8iuXbtk6NChEgqF5JFHHpEzzjhDli9fLgkJCSIicuaZZ8qCBQvk2muvlfT0dNm4caN8/vnnsmrVKklPT5dRo0bJtddeK+XKlZO77rpLRERq1qyptnPVVVdJ9erV5Z577pHMzMwSH7d7771XRowYIccee6zcd999kpiYKD/88IN89dVXcsoppwS2ISsrS7p37y5r166VoUOHSoMGDeT777+XO+64Q9atWyejRo0SERHP86Rv374yffp0ueKKK6RVq1by7rvvyqBBg0rcXkII+VviEUIIIYTsR1599VVPRLwvvvjC27Rpk7d69Wpv4sSJXvXq1b2kpCRv9erVbt4TTzzRa9eunZeTk+P+FolEvGOPPdZr1qyZ+9s999zjiYg3adKkItuLRCKe53neqFGjPBHxxo4d63J5eXle586dvXLlynk7d+70PM/zVqxY4YmIV7VqVW/r1q1u3vfff98TEe+DDz7wPM/ztm3b5omI9+ijjwbub5s2bbzu3btHPQ5du3b1CgoKVG7QoEFew4YNiywzfPhwDx/XlixZ4oXDYa9///5eYWHhXvc7qA3333+/l5aW5i1evFj9/fbbb/fi4uK8VatWeZ7nee+9954nIt4jjzzi5ikoKPC6devmiYj36quvRtt9Qgg5JGBpNCGEEEIOCCeddJJUr15d6tevLwMGDJC0tDSZPHmyKw/eunWrfPXVV3L22WfLrl27ZPPmzbJ582bZsmWL9OzZU5YsWeK+Mv3OO+/I4Ycf7n4hRvaUEn/88cdSq1YtOe+881wuISFBrrvuOtm9e7dMmzZNLXfOOeeoX6f3lG4vX75cRERSUlIkMTFRvv76a9m2bVupj8Nll10mcXFxpVr2vffek0gkIvfcc4+Ew/oxbm8l1JYJEyZIt27dpHLlyu74bt68WU466SQpLCyUb775RkT+PHbx8fFy5ZVXumXj4uLk2muvLVW7CSHk7wZLowkhhBByQHjmmWekefPmsmPHDnnllVfkm2++kaSkJJdfunSpeJ4nd999t9x99917XcfGjRulbt26smzZMjnzzDMDt7dy5Upp1qxZkRfGVq1auTzSoEEDNb3npXjPS29SUpKM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6u9vvPGG1KxZU4466qiD1LLYIWZfhB999FHJysqSF154QapXr65y1apVk+eff14yMzPlkUcecX/fowNeuHChnH/++VK5cmXp2rWryiHZ2dly3XXXSbVq1aR8+fJy+umny9q1a4voDPamEU5PT5fevXvL9OnT5eijj5bk5GRp3LixvP7662obW7dulVtuuUXatWsn5cqVkwoVKkivXr1k7ty5ZXSk/H1bvHixXHjhhVKxYkWpXr263H333eJ5nqxevVr69u0rFSpUkFq1asnjjz+uls/Ly5N77rlHOnToIBUrVpS0tDTp1q2bTJ06tci2tmzZIhdddJFUqFBBKlWqJIMGDZK5c+fuVd+8aNEiGTBggFSpUkWSk5PlqKOOksmTJ5fZfpN/HsW5FjMyMlyfcO+997ryJbxni3Pt7bmvv/vuO7npppukevXqkpaWJv3795dNmza5+dLT02XBggUybdo0t60ePXqUaL/2lFm9/fbbcu+990rdunWlfPnyMmDAANmxY4fk5ubKDTfcIDVq1JBy5crJxRdfLLm5uWodr776qpxwwglSo0YNSUpKktatW8vo0aOLbCsSiciIESOkTp06kpqaKscff7wsXLhQ0tPTZfDgwWre7du3yw033CD169eXpKQkadq0qYwcOVIikUiJ9o+QA82e+3f69Oly3XXXSfXq1aVSpUoydOhQycvLk+3bt8vAgQOlcuXKUrlyZbn11lvF8zy1jscee0yOPfZYqVq1qqSkpEiHDh32Kjsq7rOCiMjatWvlkksukZo1a0pSUpK0adNGXnnllf15KAjZJ+PGjZPKlSvLaaedJgMGDNjrizBKEF544QVp0qSJJCUlSceOHWX27NlF5v/qq6+kW7dukpaWJpUqVZK+ffvKb7/9puY5kM+nyNSpUyUUCu21cvSNN96QUCgkM2bM2Odx69u3ryQlJcmECROKrOPss8+WuLi4IssUd6ze8x7x2WefSfv27SU5OVlat24tkyZN2me7Yon4g92Ag8UHH3wg6enp0q1bt73mjzvuOElPT5ePPvqoSO6ss86SZs2ayYMPPlhk4EMGDx4sb7/9tlx00UVyzDHHyLRp0+S0004rdhuXLl0qAwYMkCFDhsigQYPklVdekcGDB0uHDh2kTZs2IiKyfPlyee+99+Sss86SRo0ayYYNG+T555+X7t27y8KFC6VOnTrF3t6+OOecc6RVq1by8MMPy0cffSQPPPCAVKlSRZ5//nk54YQTZOTIkTJu3Di55ZZbpGPHjnLccceJiMjOnTvlpZdekvPOO08uu+wy2bVrl7z88svSs2dPmTVrlrRv315E/nzA7tOnj8yaNUuuvPJKadmypbz//vsyaNCgIm1ZsGCBdOnSRerWrSu33367pKWlydtvvy39+vWTd955R/r3719m+03+ORTnWqxevbqMHj1arrzySunfv7+cccYZIiJy2GGHiUjJr71rr71WKleuLMOHD5eMjAwZNWqUXHPNNfLWW2+JiMioUaPk2muvlXLlysldd90lIiI1a9Ys1f499NBDkpKSIrfffrssXbpUnnrqKUlISJBwOCzbtm2TESNGyMyZM2XMmDHSqFEjueeee9yyo0ePljZt2sjpp58u8fHx8sEHH8hVV10lkUhErr76ajffHXfcIY888oj06dNHevbsKXPnzpWePXtKTk6OaktWVpZ0795d1q5dK0OHDpUGDRrI999/L3fccYesW7dORo0aVap9JORAcu2110qtWrXk3nvvlZkzZ8oLL7wglSpVku+//14aNGggDz74oHz88cfy6KOPStu2bWXgwIFu2f/+979y+umnywUXXCB5eXkyfvx4Oeuss+TDDz9UzwLFfVbYsGGDHHPMMe4bAdWrV5dPPvlEhgwZIjt37pQbbrjhQBwSQoowbtw4OeOMMyQxMVHOO+88GT16tMyePVs6duxYZN433nhDdu3aJUOHDpVQKCSPPPKInHHGGbJ8+XJJSEgQEZEvvvhCevXqJY0bN5YRI0ZIdna2PPXUU9KlSxf56aefJD09Xa1zfz+fWnr06CH169eXcePGFRnzx40bJ02aNJHOnTvv87ilpqZK37595c0335Qrr7xSRETmzp0rCxYskJdeeknmzZtXZJnijtUiIkuWLJFzzjlHrrjiChk0aJC8+uqrctZZZ8mnn34qJ5988j7bFxN4Mcj27ds9EfH69u0bON/pp5/uiYi3c+dOz/M8b/jw4Z6IeOedd16Reffk9vDjjz96IuLdcMMNar7Bgwd7IuINHz7c/e3VV1/1RMRbsWKF+1vDhg09EfG++eYb97eNGzd6SUlJ3s033+z+lpOT4xUWFqptrFixwktKSvLuu+8+9TcR8V599dXAfZ46daonIt6ECROK7Nvll1/u/lZQUODVq1fPC4VC3sMPP+z+vm3bNi8lJcUbNGiQmjc3N1dtZ9u2bV7NmjW9Sy65xP3tnXfe8UTEGzVqlPtbYWGhd8IJJxRp+4knnui1a9fOy8nJcX+LRCLescce6zVr1ixwH8k/kz330ezZs6POU9xrcdOmTUXu0z0U99rb056TTjrJi0Qi7u833nijFxcX523fvt39rU2bNl737t2Lva8i4l199dVues9927ZtWy8vL8/9/bzzzvNCoZDXq1cvtXznzp29hg0bqr9lZWUV2U7Pnj29xo0bu+n169d78fHxXr9+/dR8I0aM8ERE3ff333+/l5aW5i1evFjNe/vtt3txcXHeqlWrir2/hOxP9oyPjz76qPvbnvu3Z8+e6v7t3LmzFwqFvCuuuML9bc94aO9he0/l5eV5bdu29U444QT3t5I8KwwZMsSrXbu2t3nzZjXvueee61WsWHGv9zAh+5s5c+Z4IuJ9/vnnnuf9OR7Wq1fPu/7669V8e+6zqlWrelu3bnV/f//99z0R8T744AP3t/bt23s1atTwtmzZ4v42d+5cLxwOewMHDnR/O1DPp57nFbkf77jjDi8pKUmN5Rs3bvTi4+P3+uyA4LP2hx9+6IVCITcmDhs2zI273bt399q0aaOWLc5Y7Xn+e8Q777zj/rZjxw6vdu3a3hFHHBHYvlgiJkujd+3aJSIi5cuXD5xvT37nzp3q71dcccU+t/Hpp5+KiMhVV12l/n7ttdcWu52tW7dWv1hXr15dWrRooXTLSUlJEg7/eRoLCwtly5YtUq5cOWnRooX89NNPxd5Wcbj00ktdHBcXJ0cddZR4nidDhgxxf69UqVKRNsbFxUliYqKI/Pmr79atW6WgoECOOuoo1cZPP/1UEhIS5LLLLnN/C4fDRf6Ha+vWrfLVV1/J2WefLbt27ZLNmzfL5s2bZcuWLdKzZ09ZsmSJrF27tkz3nfwzKO61GI3SXHuXX365kk1069ZNCgsLZeXKlWW7cyIycOBA9z/qIiKdOnUSz/PkkksuUfN16tRJVq9eLQUFBe5vKSkpLt6xY4ds3rxZunfvLsuXL5cdO3aIiMiXX34pBQUFxerXJkyYIN26dZPKlSu747R582Y56aSTpLCwUL755psy2WdC9idDhgxR9++eewrHvT3jof2mCN5T27Ztkx07dki3bt2KjHsi+35W8DxP3nnnHenTp494nqfuqZ49e8qOHTvKfMwnpDiMGzdOatasKccff7yI/OlqcM4558j48eOlsLCwyPznnHOOVK5c2U3vec7dc/+sW7dOfvnlFxk8eLBUqVLFzXfYYYfJySefLB9//HGRde7v59O9MXDgQMnNzVVyh7feeksKCgrkwgsvDFwWOeWUU6RKlSoyfvx48TxPxo8fL+edd17U+YszVu+hTp066hfrChUqyMCBA+Xnn3+W9evXF7uN/2RisjR6zwvunhfiaER7YW7UqNE+t7Fy5UoJh8NF5m3atGmx29mgQYMif6tcubJs27bNTUciEfnvf/8rzz77rKxYsUJ1OlWrVi32tkrTnooVK0pycrJUq1atyN+3bNmi/vbaa6/J448/LosWLZL8/Hz3dzw+K1eulNq1a0tqaqpa1h6zpUuXiud5cvfdd8vdd9+917Zu3LhR6tatW/ydIzFDca7FaJTm2rP3zZ4HALyPy4q93aMiIvXr1y/y90gkIjt27HD9xHfffSfDhw+XGTNmSFZWlpp/x44dUrFiRffybu/JKlWqqAcbkT9LsubNm1fkGwx72LhxYwn3jpADT0nuKXtPf/jhh/LAAw/IL7/8ojT5+GJd3GeFTZs2yfbt2+WFF16QF154Ya9t5T1FDjSFhYUyfvx4Of7442XFihXu7506dZLHH39cvvzySznllFPUMvsaE/eMMy1atCiyvVatWsmUKVMkMzNT0tLSoq6zrJ9P90bLli2lY8eOMm7cOPfCPW7cODnmmGNK9KyfkJAgZ511lrzxxhty9NFHy+rVq+X888+POn9xxuo9NG3atMj3i5o3by4if2q2a9WqVex2/lOJyRfhihUrSu3atfdae4/MmzdP6tatKxUqVFB/x/+N2Z/sTSQvIkqX/OCDD8rdd98tl1xyidx///1SpUoVCYfDcsMNN5T5B2n21p7itHHs2LEyePBg6devnwwbNkxq1KghcXFx8tBDD8myZctK3I49+3XLLbdIz5499zpPSTohEjv81WuxNNdece6RsiLatvbVhmXLlsmJJ54oLVu2lCeeeELq168viYmJ8vHHH8t//vOfUvUlkUhETj75ZLn11lv3mt8zGBPyd6Yk9xTe099++62cfvrpctxxx8mzzz4rtWvXloSEBHn11Vf3apeyL/bcgxdeeOFev5sh4n/HgJADxVdffSXr1q2T8ePHy/jx44vkx40bV+RFeH+MiQfr+XTgwIFy/fXXy5o1ayQ3N1dmzpwpTz/9dInbf/7558tzzz0nI0aMkMMPP1xat2691/n2x1gd68Tki7CISO/eveXFF1+U6dOnuy8/I99++61kZGTI0KFDS7X+hg0bSiQSkRUrVkizZs3c38vaW23ixIly/PHHy8svv6z+vn379iL/E3awmDhxojRu3FgmTZqk/mdq+PDhar6GDRvK1KlTJSsrS/0qbI9Z48aNReTP/0U76aST9mPLyT+N4l6L0azM9te1d7Ct0z744APJzc2VyZMnq/9Zt1/O3ON1vnTpUvW/5Vu2bCnya1iTJk1k9+7dvEdJTPLOO+9IcnKyTJkyRZKSktzfX331VTVfcZ8VqlevLuXLl5fCwkLeU+Rvw7hx46RGjRryzDPPFMlNmjRJ3n33XXnuuedK9APSnnHm999/L5JbtGiRVKtWTf0a/Fco7jNBNM4991y56aab5M0335Ts7GxJSEiQc845p8Tt6Nq1qzRo0EC+/vprGTlyZNT5ijtW72FPFRvu2+LFi0VEinxwLFaJSY2wiMiwYcMkJSVFhg4dWqRMYuvWrXLFFVdIamqqDBs2rFTr3/Nr0bPPPqv+/tRTT5WuwVGIi4sr8r9oEyZM+FtpZPf8rxy284cffijyafmePXtKfn6+vPjii+5vkUikSAdbo0YN6dGjhzz//POybt26IttDaxpCkOJei3v+I2b79u3q7/vr2ktLSyuyrQPJ3o7Ljh07ijy0n3jiiRIfH1/EqmFv/wN+9tlny4wZM2TKlClFctu3b1f6ZEL+acTFxUkoFFJypYyMDHnvvffUfMV9VoiLi5MzzzxT3nnnHZk/f36R7XHcIwea7OxsmTRpkvTu3VsGDBhQ5N8111wju3btKrGtZe3ataV9+/by2muvqXFx/vz58tlnn8m//vWvMtuH4j4TRKNatWrSq1cvGTt2rIwbN05OPfXUUv0IFQqF5Mknn5Thw4fLRRddVKL27m2s3sMff/yhLJ527twpr7/+urRv355l0f+fmP1FuFmzZvLaa6/JBRdcIO3atZMhQ4ZIo0aNJCMjQ15++WXZvHmzvPnmm9KkSZNSrb9Dhw5y5plnyqhRo2TLli3OEmHP/8SU1S9AvXv3lvvuu08uvvhiOfbYY+XXX3+VcePGuV+u/g707t1bJk2aJP3795fTTjtNVqxYIc8995y0bt1adu/e7ebr16+fHH300XLzzTfL0qVLpWXLljJ58mTZunWriOhj9swzz0jXrl2lXbt2ctlll0njxo1lw4YNMmPGDFmzZk2Z+iiTQ4tXXnnFfYAGuf7664t9LaakpEjr1q3lrbfekubNm0uVKlWkbdu20rZt2/1y7XXo0EFGjx4tDzzwgDRt2lRq1KghJ5xwwl86DiXhlFNOkcTEROnTp48MHTpUdu/eLS+++KLUqFFDvfDXrFlTrr/+enn88cfl9NNPl1NPPVXmzp0rn3zyiVSrVk3do8OGDZPJkydL7969ne1bZmam/PrrrzJx4kTJyMj421StEFLWnHbaafLEE0/IqaeeKueff75s3LhRnnnmGWnatKmSZZXkWeHhhx+WqVOnSqdOneSyyy6T1q1by9atW+Wnn36SL774wo2VhBwIJk+eLLt27ZLTTz99r/ljjjlGqlevLuPGjSvxr6SPPvqo9OrVSzp37ixDhgxx9kkVK1Ys4q39VyjuM0EQAwcOlAEDBoiIyP3331/qtvTt21f69u0bOE9xx+o9NG/eXIYMGSKzZ8+WmjVryiuvvCIbNmyI+uIci8Tsi7DIn37ALVu2lIceesi9/FatWlWOP/54ufPOO6Vt27Z/af2vv/661KpVS958801599135aSTTpK33npLWrRoIcnJyWWyD3feeadkZmbKG2+8IW+99ZYceeSR8tFHH8ntt99eJusvCwYPHizr16+X559/XqZMmSKtW7eWsWPHyoQJE+Trr79288XFxclHH30k119/vbz22msSDoelf//+Mnz4cOnSpYs6Zq1bt5Y5c+bIvffeK2PGjJEtW7ZIjRo15IgjjlDeqCT22JuxvMif12Fxr0URkZdeekmuvfZaufHGGyUvL0+GDx8ubdu23S/X3j333CMrV66URx55RHbt2iXdu3c/oC/CLVq0kIkTJ8r//d//yS233CK1atWSK6+8UqpXr17ki9MjR46U1NRUefHFF+WLL76Qzp07y2effSZdu3ZV92hqaqpMmzZNHnzwQZkwYYK8/vrrUqFCBWnevLnce++96oMehPzTOOGEE+Tll1+Whx9+WG644QZp1KiRjBw5UjIyMop8n6S4zwo1a9aUWbNmyX333SeTJk2SZ599VqpWrSpt2rQJLKckZH8wbtw4SU5O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LxI9Fwr4LQ+XM/N5HrYlYP0lKnc+2GXbpLTwF2FCCCGEEEIIITEFX4QJIYQQQgghhMQUfBEmhBBCCCGEEBJTUCNMSIyBdjHW7gctbg4//HCVmzt3rout/c38+fNdjDZLIiJHHnmkizdu3KhyqAu21krffvutizt06KBy8+bNc7HVD3fu3NnFEyZMUDnUR19++eUqZzWmCLbbWk6httiuA/XEuG2RorpgpG/fvi5Gna9IUe321KlTXfzss8+qHFo2PfTQQyo3bNgwFyclJancypUrXYy6cRFtRdSqVSuV+/77712MFlciIkuWLHGxve5Qh2y12qiRtprk3NzcqDnUIVttMWp97fZQ64vz2bagBpkQQmIDHOPsb2nw/ZHA5TSeh99XiL5O1CD/uWCQ1hda4AXpd4NyZntFdM5xAbkgcJvUEh9s+IswIYQQQgghhJCYgi/ChBBCCCGEEEJiCpZGExJjYJmoLbPFMtHJkyerXJUqVVxsrWLQZsaWxGIJMNoXiehy4bZt26rczTff7OJjjz1WovHpp59GzZ111llqGvfP2hAht99+u5quUaOGi1u3bq1yQSXVaLtkS3ejtWtf67Sl4DhvixYtVO7333938YABA1QO7ZweeeQRlUNLoa1bt6pc+/btXfz000+rHF4Xdp82b97s4uzsbJXDEm5ss4guv7Z2RricBcv37fZw/6x9EmLPQ8WKFV1s7ajIoY8930Gyh2jzlWSdNh+0HkL2H/baxt/IotsLFbVIim6fFAr7kiwvovtjTwqibg+tlbTtkWlLKEFNY7l1KKSlPyFoZ8TLMTlod6DtkkgoFBc1V/qyaXKg4S/ChBBCCCGEEEJiCr4IE0IIIYQQQgiJKfgiTAghhBBCCCEkpgh5xRSlBOljYo1rr73WxWjjIqL1keXKlVM51JRZfRlazlitJGr00BJERCQhwddFhMP6/zXQJsduD/eBHBqUVj9m793jjz/exVa3+u6770ZdT2Kir9UpKChQObSZQR2liL4ujz76aJVDTeuTTz4ZddulxeqV161b52J7XC644AIXjxs3TuW6dOni4unTp6tckMYP993aLj3xxBMuXrhwocr16dPHxV27do26PRGRwYMHu3jMmDESjVmzZqnpjh07Rp135syZLh4+fLjKoV567NixUddx2223qemRI0e6+LTTTlO5TZs2uTgjIyPq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",
      "text/plain": [
       "<Figure size 1000x3000 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def visualize(img):\n",
    "    _min = img.min()\n",
    "    _max = img.max()\n",
    "    normalized_img = (img - _min) / (_max - _min)\n",
    "    return normalized_img\n",
    "\n",
    "\n",
    "diff = abs(inputting.cpu() - current_img[0].cpu()).detach().numpy()\n",
    "row = 4\n",
    "plt.style.use(\"default\")\n",
    "\n",
    "plt.figure(figsize=(10, 30))\n",
    "\n",
    "ax = plt.subplot(1, row, 2)\n",
    "ax.imshow(latent_img[0, 0].cpu().detach().numpy(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "ax.set_title(\"Latent Image\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "\n",
    "ax = plt.subplot(1, row, 3)\n",
    "ax.imshow(current_img[0, 0].cpu().detach().numpy(), vmin=0, vmax=1, cmap=\"gray\")\n",
    "ax.set_title(\"Reconstructed \\n Image\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "\n",
    "\n",
    "ax = plt.subplot(1, row, 4)\n",
    "ax.imshow(diff[0], cmap=\"inferno\")\n",
    "ax.set_title(\"Anomaly Map\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "\n",
    "ax = plt.subplot(1, row, 1)\n",
    "ax.imshow(inputting[0], vmin=0, vmax=1, cmap=\"gray\")\n",
    "ax.set_title(\"Original Image\")\n",
    "plt.tight_layout()\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "formats": "py:percent,ipynb"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  },
  "vscode": {
   "interpreter": {
    "hash": "4f1513a79f82193cb81c96943579af15c6a44d6347609348bde584197ab7b1ab"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
